package com.fast.alden.common.service;


import com.fast.alden.data.model.BaseEntity;
import com.fast.alden.data.repo.BaseEntityRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

import java.util.List;

/**
 * 基类实体服务，预置常用的业务操作逻辑
 *
 * @param <E> 实体类
 * @param <R> 仓库接口
 */
public interface BaseEntityService<E extends BaseEntity, R extends BaseEntityRepository<E>> {
    /**
     * 新增实体
     *
     * @param entity
     * @return
     */
    E create(E entity);

    /**
     * 批量新增实体
     *
     * @param entities
     * @return
     */
    List<E> createAll(Iterable<E> entities);

    /**
     * 查询全部实体列表
     *
     * @return
     */
    List<E> list();

    /**
     * 根据ID列表查询实体列表
     *
     * @param ids ID列表
     * @return
     */
    List<E> list(List<Long> ids);

    /**
     * 分页查询实体列表
     *
     * @param pageable
     * @return
     */
    Page<E> page(Pageable pageable);

    /**
     * 根据ID查找实体
     *
     * @param id
     * @return
     */
    E retrieve(Long id);

    /**
     * 根据ID查找实体，查不到时抛出异常
     *
     * @param id
     * @return
     */
    E retrieveWithException(Long id);

    /**
     * 修改实体
     *
     * @param entity
     * @return
     */
    E update(E entity);

    /**
     * 批量修改实体
     *
     * @param entities
     * @return
     */
    List<E> updateAll(Iterable<E> entities);

    /**
     * 批量删除实体
     *
     * @param ids
     * @return
     */
    List<E> remove(List<Long> ids);

    /**
     * 根据查询文本分页模糊查询实体列表
     *
     * @param searchText
     * @param pageable
     * @return
     */
    Page<E> search(String searchText, Pageable pageable);

    /**
     * 根据查询实体分页模糊查询实体列表
     *
     * @param searchVo
     * @param pageable
     * @return
     */
    Page<E> search(E searchVo, Pageable pageable);

    /**
     * 根据specification和pageable分页查询实体列表
     *
     * @param specification
     * @param pageable
     * @return
     */
    Page<E> search(Specification<E> specification, Pageable pageable);

    /**
     * 根据查询文本分页模糊查询实体列表
     *
     * @param searchText
     * @return
     */
    List<E> search(String searchText);

    /**
     * 根据查询实体分页模糊查询实体列表
     *
     * @param searchVo
     * @return
     */
    List<E> search(E searchVo);

    /**
     * 根据specification和pageable分页查询实体列表
     *
     * @param specification
     * @return
     */
    List<E> search(Specification<E> specification);
}
